package vistas;
import java.util.*;
import java.util.List;

import javax.swing.*;

import persistencia.XMLmanager;

import java.awt.*;
import java.awt.event.*;

import api.API;
import api.Dispositivo;

@SuppressWarnings("serial")
public class VistaEdificio extends JFrame implements MouseListener, ActionListener{
	private java.util.List<PlanoEdificio> planosEdificio = new ArrayList<PlanoEdificio>();	
	private VistaAgregarDispositivo vistaAgregarDispositivo;
	private VentanaDispositivos vistaDispositivo;
	private VentanaReglas vistaReglas;
	private VistaAgregarPiso vistaPiso;
	
	private PlanoEdificio planoEdificio;
	private boolean planoCargado = false;
	private int sizeW;
	private int sizeH;
	
	private JLabel titulo;
	private Container container; 
	private GridBagConstraints csVista = new GridBagConstraints();
	private Container pisos;
	private JButton agregarRegla;
	private JButton agregarPiso;
	private JButton guardar;
	
	private int pisosCargados;
	
	public VistaEdificio(int sizeW, int sizeH, List<PlanoEdificio> planos){		
		super("VistaEdificio");
		this.pisosCargados = 0;
		this.sizeW = sizeW;
		this.sizeH = sizeH;
		this.cargarPlanos(planos);
		this.setVistaAgregarDispositivo();
		this.setVentanaReglas();
		this.setVistaPiso();
		this.settearContainer();
	}
	
	public void settearContainer(){		
		if (this.container != null) this.remove(container);
		this.container = new JPanel(new GridBagLayout());
		
		this.setCsVista(0,0,1,1,0.0,0.0,GridBagConstraints.HORIZONTAL,GridBagConstraints.CENTER);				
		this.container.add(this.getBotonAgregarRegla(),csVista);
		
		this.setCsVista(0,1,1,1,0.0,0.0,GridBagConstraints.HORIZONTAL,GridBagConstraints.CENTER);				
		this.container.add(this.getBotonAgregarPiso(),csVista);
		
		this.setCsVista(0,2,1,1,0.0,0.0,GridBagConstraints.NONE,GridBagConstraints.NORTHWEST);		
		this.container.add(this.getTitulo(),csVista);
		
		JScrollPane scrollPisos = new JScrollPane();
		scrollPisos.setPreferredSize(new Dimension(120,400));
		scrollPisos.getViewport().setView(this.pisos);
		this.setCsVista(0,3,1,2,0.0,0.0,GridBagConstraints.BOTH,GridBagConstraints.CENTER);
		this.container.add(scrollPisos,csVista);
		
		JScrollPane scrollPlano = new JScrollPane();
		scrollPlano.getViewport().setView(this.getPlanoEdificio());
		this.planoEdificio.addMouseListener(this);
		this.setCsVista(2,0,5,5,1.0,1.0,GridBagConstraints.BOTH,GridBagConstraints.CENTER);		
		this.container.add(scrollPlano,csVista);
		
		this.setCsVista(0,5,1,1,0.0,0.0,GridBagConstraints.HORIZONTAL,GridBagConstraints.CENTER);				
		this.container.add(this.getBotonGuardar(),csVista);
		
		this.setContentPane(container);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);					
		this.pack();
		this.setSize(this.sizeW, this.sizeH);
	}
	
	private void setCsVista(int x, int y, int cantCeldas, int cantLineas, double largoCelda, double altoCelda, int fill, int anchor){
		this.csVista.gridx = x;
		this.csVista.gridy = y;
		this.csVista.gridwidth = cantCeldas;
		this.csVista.gridheight = cantLineas;
		this.csVista.weightx = largoCelda;
		this.csVista.weighty = altoCelda;
		this.csVista.fill = fill;
		this.csVista.anchor = anchor;
	}
	
	private JRadioButton getJRadioButton(int piso,PlanoEdificio plano){

		JRadioButton boton = new JRadioButton(plano.getId()){
			//Pongo que hacer cuando se hace clic
			protected void processMouseEvent(MouseEvent event){
				if (event.getID() == MouseEvent.MOUSE_CLICKED){
					desmarcarBotones();
					this.setSelected(true);
					
					Iterator itPlanos = planosEdificio.iterator();
					
					while(itPlanos.hasNext()){
						PlanoEdificio plano = (PlanoEdificio) itPlanos.next();
						if (this.getText().compareTo(plano.getId())==0){
							planoEdificio = plano;
							if (vistaDispositivo == null) vistaDispositivo = new VentanaDispositivos(plano);
							else vistaDispositivo.setPlano(plano);
							planoCargado = true;
						}
						
					}				
					settearContainer();
				}
			}
		};
		return boton;
	}
	
	private void desmarcarBotones(){
		Component[] componentes = this.pisos.getComponents();
		int cantidad = componentes.length;
		
		for (int i = 0; i < cantidad; i++) {
			((JRadioButton)componentes[i]).setSelected(false);
		}
	}
	
	private JButton getBotonAgregarRegla(){
		if (this.agregarRegla == null) {
			this.agregarRegla = new JButton("Agregar Regla"){
				//Pongo que hacer cuando se hace clic
				protected void processMouseEvent(MouseEvent event){
					if (event.getID() == MouseEvent.MOUSE_CLICKED){
						if (planoEdificio != null){
							this.doClick();
							vistaReglas.actualizar();
							vistaReglas.setVisible(true);
						}
					}
				}
			};		
		}
		return this.agregarRegla;
	}
	
	private JButton getBotonAgregarPiso() {
		this.vistaPiso.setVistaEdificio(this);
		if (this.agregarPiso == null) {
			this.agregarPiso = new JButton("Agregar Piso"){
				//Pongo que hacer cuando se hace clic
				protected void processMouseEvent(MouseEvent event){
					if (event.getID() == MouseEvent.MOUSE_CLICKED){
						vistaPiso.setVisible(true);
					}
				}
			};
		this.agregarPiso.addMouseListener(this);			
		}
		return this.agregarPiso;
	}
	
	private Component getBotonGuardar() {
		if (this.guardar == null) {
			this.guardar = new JButton("Guardar"){
				//Pongo que hacer cuando se hace clic
				protected void processMouseEvent(MouseEvent event){
					if (event.getID() == MouseEvent.MOUSE_CLICKED){
						this.doClick();
						XMLmanager man = new XMLmanager();
						man.serializar(planosEdificio, API.obtenerInstancia().getReglas());
					}
				}
			};
			this.guardar.addMouseListener(this);			
		}
		return this.guardar;
	}

	
	private JLabel getTitulo(){
		if (this.titulo == null) {
			this.titulo = new JLabel("Pisos");
		}		
		return this.titulo;
	}
		
	private PlanoEdificio getPlanoEdificio(){
		if (this.planoEdificio == null) {
			this.planoEdificio = new PlanoEdificio();
			this.planoEdificio.addMouseListener(this);
		}		
		return this.planoEdificio;
	}
	
	private void setVentanaReglas(){
		this.vistaReglas = new VentanaReglas();
	}
	
	private void setVistaPiso(){
		this.vistaPiso = new VistaAgregarPiso(this);
	}
	
	private void showVistaDispositivo(Dispositivo d){
		this.vistaDispositivo.seleccionarDispositivo(d);	
		this.vistaDispositivo.setVisible(true);
	}
	
	private void setVistaAgregarDispositivo(){
		this.vistaAgregarDispositivo = new VistaAgregarDispositivo();
		this.vistaAgregarDispositivo.setVisible(false);
	}
	
	private void showVistaAgregarDispositivo(int x, int y){
		this.vistaAgregarDispositivo.setPlano(this.planoEdificio);
		this.vistaAgregarDispositivo.setPiso(this.planoEdificio.getId());
		this.vistaAgregarDispositivo.setClickXY(x, y);
		this.vistaAgregarDispositivo.setVisible(true);
	}
	
	private void cargarPlanos(List<PlanoEdificio> planos){
		this.planosEdificio = new ArrayList<PlanoEdificio>();
		this.pisos = new JPanel();
		BoxLayout boxL = new BoxLayout(this.pisos, BoxLayout.PAGE_AXIS);
		this.pisos.setLayout(boxL);
		Iterator<PlanoEdificio> itP = planos.iterator();
		
		while (itP.hasNext()) {
			PlanoEdificio plano = itP.next();
			this.agregarPlano(plano);
		}
	}
	
	protected void agregarPlano(PlanoEdificio plano) {
		this.planosEdificio.add(plano);
		this.pisos.add(this.getJRadioButton(this.pisosCargados,plano));
		this.pisos.validate();
		this.pisosCargados++;	
	}

	public void mouseClicked(MouseEvent arg0) {
		if (arg0.getID() == MouseEvent.MOUSE_CLICKED){
			if (arg0.getSource() == this.planoEdificio){
				if (this.planoCargado){
					Dispositivo d = this.planoEdificio.obtenerDispositivo(arg0.getX(), arg0.getY());
					if (d != null) {
						this.showVistaDispositivo(d);
					} else this.showVistaAgregarDispositivo(arg0.getX(),arg0.getY());
				}
			}
		}
	}	
	
	public void mouseEntered(MouseEvent arg0) {}
	public void mouseExited(MouseEvent arg0) {}
	public void mousePressed(MouseEvent arg0) {}	
	public void mouseReleased(MouseEvent arg0) {}	
	public void actionPerformed(ActionEvent e){}
	
}
